#下面是用大气散射模型模拟人工合成含雾图像
#I(X)=J(X)*t(X)+A（1-t（x））
#I（x）为观测到的图像，j（x）为清晰图像，t（x）散射系数，A为大气光值
import os
import torch
from PIL import Image
from torchvision import transforms
image_path = "D:\\dehaze\\test.jpg"
image = Image.open(image_path).convert('RGB')
transform = transforms.Compose([
    transforms.Resize((256,256)),#Resize函数在只传入一个参数的时候，会将短边缩放到该参数，将长边等比例缩放，如果传入一个元组则会强制缩放
    transforms.ToTensor()
])
image = transform(image)
#print(image.size())
#image.show()#PIL内置的查看图片的函数
def simple_transmission(height=256, width=256, beta=0.1):
    """生成基于中心距离的透射率图"""
    # 创建网格坐标（归一化到0-1）
    y = torch.linspace(-1, 1, height).view(-1, 1)
    x = torch.linspace(-1, 1, width).view(1, -1)

    # 计算到中心点的距离（圆形渐变）
    distance = torch.sqrt(x ** 2 + y ** 2)  # 值域[0, √2]
    normalized_dist = (distance - distance.min()) / (distance.max() - distance.min())

    # 透射率公式：t = exp(-beta*distance)
    transmission = torch.exp(-beta * normalized_dist * 5)  # 乘以5增强距离影响
    return torch.clamp(transmission, 0.2, 0.95)
t=simple_transmission(256,256,0.5)#随机生成一个3*256*256的tensor张量,从（0，1]采样
t_expanded = t.expand(3, -1, -1)
A=0.5 #这个大气光常数好像和图片的亮度有关系，然后t（x）就是和雾的浓厚有关系
image_haze=image*t_expanded+A*(1-t_expanded)
#接下来我们要将张量转换为Image对象，但是此时的维度是（CxHxW），但是Image对象维度是(HxWxC)
#image_haze=image_haze.permute(1,2,0)#索引对应的是原始维度中的索引，修改后的值对应新的索引
#下面的函数会自动转换维度，所以不需要手动转换
image_haze=transforms.ToPILImage()(image_haze)#为什么transforms要先创建一个对象再处理呢？
image_haze.show()
image=transforms.ToPILImage()(t_expanded)
image.show()